perm filename IMPSTA.MID[NET,MRC]4 blob sn#352673 filedate 1978-05-05 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00014 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE IMPSTAT
C00005 00003	Monitor pointers
C00007 00004	Start of program
C00009 00005	Get initial monitor information
C00011 00006	Initialize display, IMP going down
C00014 00007	 Header and link stuff: Index, host, foreign socket
C00018 00008	 Local socket, byte size, state
C00020 00009	 Allocations
C00022 00010	PTY map
C00024 00011	Trailer stuff
C00025 00012	Display it!
C00027 00013	Random stuff
C00029 00014	Random data
C00030 ENDMK
C⊗;
TITLE IMPSTAT
SUBTTL Definitions

; Mark Crispin, SU-AI, May 1978

X=1 ? Y=2 ? Z=3 ? L=4 ? I=5 ? N=6 ? DDB=7 ? J=10 ? T=11 ? A=12 ? B=13 ? C=14 ? P=17

PDLLEN==50.				; stack size

; GETLIN bits

IIILIN==400000,,			; terminal is a III
DMLIN==	040000,,			; terminal is a DM
DDDLIN==020000,,			; terminal is a DD

; APRENB bits

ILM==	020000				; MPV occured

; Data Risc command word

DEFINE CW ?C1,B1,C2,B2,C3,B3
 <<B1←28.>\<B2←20.>\<B3←12.>\<C1←9.>\<C2←6.>\<C3←3>\4>
TERMIN

; Data Risc command names

EXCT==	0				; execute
FNCN==	1				; function, usual value bytes
	ALPHBG==6 ? ALPHA==46
CHNL==	2				; channel select
COLM==	3				; column select
HILIN==	4				; set high 5 bits of line address
LOLIN==	5				; set low 4 bits of line address

IMP==   400				; IMP interface device code

; IMP status bits

RFCS==	200000,,			; RFC sent
RFCR==	100000,,			; RFC received
CLSS==	040000,,			; CLS sent
CLSR==	020000,,			; CLS received

; IMP DDB stuff

DEVCHR==1				; characteristics
DEVIOS==2				; I/O status
 ALLW==	020000,,			; allocation wait
MAL==	14				; message allocation
BAL==	15				; bit allocation
NHMA==	16				; nominal message allocation
NHBA==	17				; nominal bit allocation
HMA==	22				; remote message allocation
HBA==	23				; remote bit allocation
MIIL==	24				; messages in input list
BIIL==	25				; bits in input list
SUBTTL Monitor pointers

FFLNK:	0				; first free link
IMPDIE:	0				; NCP locked out
IMPDEA:	0				; NCP down
NMESIN:	0				; messages in
NMESOU:	0				; messages out
IMPDWY:	0				; why IMP going down
IMPTDN:	0				; when IMP going down
IMPTUP:	0				; when IMP coming back up (usual lie)

; IMP table pointers indexed by IMP index up by 1, so RH is addr-1

LNKTAB:	(I)				; host-link number
IMPDDB:	(I)				; address of DDB
IMPLS:	(I)				; local socket number
IMPFS:	(I)				; foreign socket number
IMPBS:	(I)				; byte size
IMPSTB:	(I)				; link status

; Pointers indexed by job number

PRJPRG:	(J)				; PPN
JOBNAM:	(J)				; program name

; Pointers indexed by PTY number

PTYJOB:	(T)				; PTY mother

; Pointers indexed by TTY number

TTYTAB:	(T)				; TTY DDB pointer
SUBTTL Start of program

IMPSTA:	JFCL
	RESET
	MOVE P,[PDL(-PDLLEN)]

; Map in host table

	OPEN [17 ? 'DSK,, ? 0]		; get a disk channel
	 JRST 4,.-1
	DMOVE [SIXBIT/HOSTS1BIN/] ? DMOVE 2,[0 ? 'NETMRC]
	LOOKUP				; find file HOSTS1.BIN[NET,MRC]
	 JRST 4,.-1
	MOVE Y,JOBFF
	MOVS Z ? MOVN ? ADDB JOBFF	; get address of highest addr we need
	HRRM DPHEAD
	MOVEM DPHEAD+3
	AOS DPHEAD+3
	CORE				; get more core from system maybe
	 JRST 4,.-1
	HRRZ DPHEAD
	ADDI 2
	MOVEM SCREEN
	MOVE Z ? HRRI -1(Y)		; compute IOWD to read host table in
	SETZ X,
	INPUT
	MOVE (Y)			; get first word of host table
	CAME ['HOSTS1]
	 JRST 4,.-1
	MOVEM Y,HSTADR			; remember where host table begins
	RELEAS

; Make sure we never lose with MPV

	MOVEI [	MOVE JOBREL
		ADDI 2000		; another K of core, please
		CORE
		 JRST 4,IMPSTA
		LOCK
		JRST GETNET]		; restart status
	MOVEM JOBAPR
	MOVEI ILM
	APRENB
	LOCK				; ensure fast response
; (continued on next page)
SUBTTL Get initial monitor information

; Snarf up some monitor symbols

	IRPS SYM,,FFLNK IMPDIE IMPDEA NMESIN NMESOU IMPDWY IMPTDN IMPTUP
	 MOVEI X,[.RSQZ 0,SYM ? 0]
	 .SYML X,
	  JRST 4,.-1
	 ADDI X,400000
	 MOVEM X,SYM
	TERMIN

	IRPS SYM,,LNKTAB IMPDDB IMPLS IMPFS IMPBS IMPSTB
	 MOVEI X,[.RSQZ 0,SYM ? 0]
	 .SYML X,
	  JRST 4,.-1
	 ADDI X,377777
	 HRRM X,SYM
	TERMIN

; Map the monitor in

	MOVSI 377777
	SETPR2
	 JRST 4,.-1

; Get symbols with low core pointers the easy way

	MOVE 400211			; PRJPRG
	ADDI 400000
	HRRM PRJPRG
	MOVE 400225			; JOBNAM
	ADDI 400000
	HRRM JOBNAM
	MOVE 400270			; PTYJOB
	ADDI 400000-121			; indexed by PTY number
	HRRM PTYJOB
	MOVE 400220			; TTYTAB
	ADDI 400000
	HRRM TTYTAB
	MOVE J,400226			; JOB
	MOVE J,400000(J)
	MOVE L,400236			; JBTLIN
	ADDI L,400000(J)
	MOVE L,(L)
	CAMN L,[-1]
	 EXIT				; punt if detached
	MOVEI L,400000(L)
	ADD L,400302			; LINTAB
	MOVE L,(L)

; Fool around with the page printer

	HRROI [015000,,HSIZE]
	TTYSET
	PPSEL 1
	DPYPOS -452			; near botton of screen
	DPYSIZ 3002			; 3 glitches, 2 lines/glitch
; (continued on next page)
SUBTTL Initialize display, IMP going down

GETNET:	SETZB @SCREEN
	ADJSP @SCREEN
	AOS
	BLT @JOBREL
	MOVSI X,440700
	ADD X,SCREEN
	SETZM LINCNT
	TLNN (DMLIN)
	 JRST HDNODM
	MOVEI 177
	IDPB X
	MOVEI ↑W
	IDPB X
HDNODM:	SKIPN A,@IMPDWY
	 JRST NOTIDI			; IMP isn't dying
	JSP Y,TXTSTR
	 ASCIZ/     IMP going down at /
	MOVE Y,IMPTDN
	IDIVI Y,60.*60.			; minutes
	IDIVI Y,60.			; Y←hours, Z←minutes
	CAIL Y,24.
	 SUBI Y,24.
	PUSH P,Z
	IDIVI Y,10.			; ah, the joys of open coding!
	MOVEI "0(Y)
	IDPB X
	MOVEI "0(Z)
	IDPB X
	MOVEI B,":
	IDPB B,X
	POP P,Y
	IDIVI Y,10.
	MOVEI "0(Y)
	IDPB X
	MOVEI "0(Z)
	IDPB X
	JSP Y,TXTSTR
	 ASCIZ/ until /
	MOVE Y,IMPTUP
	IDIVI Y,60.*60.			; minutes
	IDIVI Y,60.			; Y←hours, Z←minutes
	CAIL Y,24.
	 SUBI Y,24.
	PUSH P,Z
	IDIVI Y,10.
	MOVEI "0(Y)
	IDPB X
	MOVEI "0(Z)
	IDPB X
	IDPB B,X
	POP P,Y
	IDIVI Y,10.
	MOVEI "0(Y)
	IDPB X
	MOVEI "0(Z)
	IDPB X
	JSP Y,TXTSTR
	 ASCIZ/ for /
	JUMPE A,[	JSP Y,TXTSTR
			 ASCIZ/panic restart/
			JRST IMPDDN]
	SOJE A,[JSP Y,TXTSTR
		 ASCIZ/scheduled hardware PM/
		JRST IMPDDN]
	SOJE A,[JSP Y,TXTSTR
		 ASCIZ/scheduled software reload/
		JRST IMPDDN]
	JSP Y,TXTSTR
	 ASCIZ/emergency restart/
IMPDDN:	PUSHJ P,TERPRI
	MOVEI <" >
	IDPB X
	PUSHJ P,TERPRI
; (continued on next page)
; Header and link stuff: Index, host, foreign socket

NOTIDI:	SKIPE @IMPDIE
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/                       NCP locked out!/
		PUSHJ P,TERPRI
		JRST .+1]
	SKIPE @IMPDEAD
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/                          NCP dead!/
		PUSHJ P,TERPRI
		JRST .+1]
	SKIPN @FFLNK
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/                  Nobody is using the IMP!/
		PUSHJ P,TERPRI
		JRST MSGEND]
	MOVEI I,1
	JSP Y,TXTSTR
	 ASCIZ/Ix Host           Lnk   For'n skt Lskt BS Stat Jb  User  Subsys Allocs/
	PUSHJ P,TERPRI
NXTLNK:	MOVEI Y,-1(I)
	MOVEI N,2
	PUSHJ P,OCTOUT			; table index
	MOVEI <" >
	IDPB X
	LDB [103000,,@LNKTAB]
	JUMPE [	JSP Y,TXTSTR		; listening, sorry!
		 ASCIZ/                   /
		JRST FORSKT]
	MOVE A,HSTADR
	MOVE A,7(A)			; NUMPTR
	ADD A,HSTADR			; address of NUMBERS table
	MOVE B,(A)			; get # of entries
	MOVE C,1(A)			; and entry size
	ADDI A,2			; point at first entry
HSTSRH:	MOVE Y,(A)
	CAILE Y,377			; old or new style?
	 JRST [	LDB Z,[001000,,Y]	; new style, get host number
		LSH Y,-9.		; put IMP number in IMP format place
		DPB Z,[201000,,Y]
		JRST HSTSR0]
	LDB Z,[060300,,Y]		; old style, get host number
	ANDI Y,77
	DPB Z,[200200,,Y]		; store host number in IMP format
HSTSR0:	CAME Y				; found host?
	 JRST [	ADDI A,(C)		; point at next entry
		SOJG B,HSTSRH
		JSP Y,TXTSTR
		 ASCIZ/Host #/
		LDB Y,[103000,,@LNKTAB]	; host unknown, use number
		MOVEI N,8.
		PUSHJ P,OCTOUT		; host number
		SETZ Z,
		JRST DOLINK]
	HRRZ Y,1(A)			; NUMNAM
	ADD Y,HSTADR
	MOVEI Z,14.			; assume all hosts stop at 14 characters
	TLOA Y,440700
HSTOUT:	 IDPB X
	ILDB Y
	JUMPE DOLINK
	SOJA Z,HSTOUT
DOLINK:	MOVEI <" >
	IDPB X
	SOJGE Z,DOLINK			; fill out with spaces as necessary
	LDB Y,[001000,,@LNKTAB]
	MOVEI N,3
	PUSHJ P,OCTOUT			; link number
	MOVEI <" >
	IDPB X
FORSKT:	MOVE Y,@IMPFS			; foreign socket number
	CAMN Y,[-1]
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/  listening/
		JRST DPYLS]
	MOVEI N,11.
	PUSHJ P,OCTOUT
; (continued on next page)
; Local socket, byte size, state

DPYLS:	MOVEI <" >
	IDPB X
	MOVE Y,@IMPLS			; local socket number
	MOVEI N,4
	PUSHJ P,OCTOUT
	MOVEI <" >
	IDPB X
	MOVE Y,@IMPBS			; byte size
	MOVEI N,2
	PUSHJ P,DECOUT
	MOVE @IMPSTB
	TLNN (CLSS\CLSR)
	 JRST NOTCLS
	TLNN (CLSS)
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/ CLSR/
		JRST STADUN]
	TLNN (CLSR)
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/ CLSS/
		JRST STADUN]
	JSP Y,TXTSTR
	 ASCIZ/ CLSD/
	JRST STADUN
NOTCLS:	TLNN (RFCS\RFCR)
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/ LISN/
		JRST STADUN]
	TLNN (RFCS)
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/ RFCR/
		JRST STADUN]
	TLNN (RFCR)
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/ RFCS/
		JRST STADUN]
	JSP Y,TXTSTR
	 ASCIZ/ OPEN/

; Start of DDB stuff

STADUN:	SKIPN DDB,@IMPDDB
	 JRST NODDB			; no DDB for this guy
	MOVEI <" >
	IDPB X
	MOVEI J,DEVCHR(DDB)
	PEEK J,				; DDB's can be in upper 1/2 moby
	LSH J,-30.
	PUSHJ P,JOBOUT
	MOVEI <" >
	IDPB X
	MOVEI Y,DEVIOS(DDB)
	PEEK Y,
	MOVEI "W
	TLNE Y,(ALLW)
	 IDPB X
; (continued on next page)
; Allocations

	MOVE @IMPLS
	TRNN 1				; send or receive?
	 JRST [	MOVEI Y,HMA(DDB)	; receive; foreign message allocation
		PEEK Y,
		PUSHJ P,DECOUT
		MOVEI "/
		IDPB X
		MOVEI Y,HBA(DDB)
		PEEK Y,
		PUSHJ P,DECOUT
		MOVEI Y,MIIL(DDB)	; messages in input list
		PEEK Y,
		JUMPE Y,NODDB
		MOVEI <" >
		IDPB X
		MOVEI "[
		IDPB X
		PUSHJ P,DECOUT
		MOVEI "/
		IDPB X
		MOVEI Y,BIIL(DDB)	; bits in input list
		PEEK Y,
		PUSHJ P,DECOUT
		MOVEI "]
		IDPB X
		JRST NODDB]
	MOVEI Y,MAL(DDB)		; send socket; message allocation
	PEEK Y,
	PUSHJ P,DECOUT			; note N=-1 from last DECOUT call
	MOVEI "/
	IDPB X
	MOVEI Y,BAL(DDB)		; bit allocation
	PEEK Y,
	PUSHJ P,DECOUT
	MOVEI <" >
	IDPB X
NODDB:	PUSHJ P,TERPRI
	CAMGE I,@FFLNK
	 AOJA I,NXTLNK
; (continued on next page)
SUBTTL PTY map

	LDB T,[001100,,400221]		; number of PTY's
	HRLOI T,-1(T)
	EQVI T,121			; first PTY
	SKIPN J,@PTYJOB
	 AOBJN T,.-1
	JUMPE J,MSGEND
	MOVEI <" >
	IDPB X
	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/PTY CJ  CUsr  CSbsys SJ  SUsr  SSbsys Location/
	PUSHJ P,TERPRI
	JRST PTYFND

PTYLUP:	SKIPN J,@PTYJOB
	 JRST NXTPTY
PTYFND:	MOVEI N,3
	PUSH P,J
	MOVEI Y,(T)
	PUSHJ P,OCTOUT
	MOVEI <" >
	IDPB X
	PUSHJ P,JOBOUT
	HRRZ J,@TTYTAB
	ADDI J,DEVCHR&377777
	PEEK J,				; TTY DDB's may be in upper 128K
	LDB J,[360600,,J]
	JUMPE J,[	JSP Y,TXTSTR
			 ASCIZ/                  /
			JRST GETLOC]
	MOVEI <" >
	IDPB X
	PUSHJ P,JOBOUT
	MOVEI <" >
	IDPB X
GETLOC:	POP P,A				; try for TELSER's 137 convention
	HRROI B,137
	MOVEI C,B
	MOVEI A
	JOBRD
	 JRST NTELSR
	JUMPE B,NTELSR
	TLNE B,-1
	 JRST NTELSR
	HRLI B,-13
	MOVEI C,HDABLK
	JOBRD
	 JRST NTELSR
	MOVE HDABLK
	CAME ['TERMID]
	 JRST NTELSR
	SKIPA Y,[440700,,HDABLK+1]
	 IDPB X
	ILDB Y
	JUMPN .-2
NTELSR:	PUSHJ P,TERPRI
NXTPTY:	AOBJN T,PTYLUP
; (continued on next page)
SUBTTL Trailer stuff

MSGEND:	MOVEI <" >
	IDPB X
	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/IMP CONI=/
	EIOTM
	CONI IMP,Y
	JRST 2,@[.+1]			; better than LIOTM
	MOVEI N,6
	PUSHJ P,OCTOUT
	JSP Y,TXTSTR
	 ASCIZ/, input messages=/
	MOVE Y,@NMESIN
	PUSHJ P,OCTOUT
	JSP Y,TXTSTR
	 ASCIZ/, output messages=/
	MOVE Y,@NMESOU
	PUSHJ P,OCTOUT
	PUSHJ P,TERPRI
	MOVE Z,HSIZE
	TLNE L,(DDDLIN\DMLIN)
CLREOF:	 CAMG Z,LINCNT
	  JRST NODDDM			; III or printing
	MOVEI <" >
	IDPB X
	PUSHJ P,TERPRI
	SOJA Z,CLREOF
; (continued on next page)
SUBTTL Display it!

NODDDM:	TLNN X,700000			; if at word boundry
	 ADDI X,1
	SETZM 1(X)			; HALT to stop program
	MOVEI X,(X)
	MOVEI 2(X)
	SUBI @DPHEAD
	MOVEM DPHEAD+1			; save display program length
	AOS (X)
	CAME X,SCREEN
	 SOJA X,.-2

; Now output the accumulated text

	TLNN L,(DDDLIN\IIILIN\DMLIN)
	 JRST [	OUTSTR @SCREEN
		OUTSTR [ASCIZ/

/]
		JRST DELAY]
	JUMPL L,DOIII
	TLNE L,(DMLIN)
	 JRST [	SETZM @DPHEAD
		MOVE X,[.BYTE 7 ? 177 ? ↑L ? 140 ? 142]; cursor at third line
		JRST DODM]
	MOVE TXTOUT
	MOVEM @DPHEAD
	SKIPA X,COLPOS
DOIII:	 MOVE X,[.BYTE 11.,11.,3,3,2,2,4 ? -777 ? 640 ? 2 ? 3 ? 1 ? 2 ? 6]
DODM:	MOVEM X,@DPHEAD+3
	UPGIOT 1,DPHEAD			; display the text

; Done, wait a while and go again

DELAY:	MOVEI 20.
	TLNE L,(DDDLIN\IIILIN)
	 MOVEI 1
	TLNE L,(DMLIN)
	 MOVEI 5.
	SLEEP
	SNEAKS
	 JRST GETNET
	CAIE ↑M
	 JRST DELAY1
	INCHRW				; only eat CRLF's
	INCHRW
DELAY1:	HRROI [004000,,400\"N]
	TTYSET
	EXIT
SUBTTL Random stuff

TERPRI:	JSP Y,TXTSTR
	 ASCIZ/
/
	AOS LINCNT
	TLNN (DMLIN)
	 POPJ P,
	MOVEI 177
	IDPB X
	MOVEI ↑W
	IDPB X
	POPJ P,

; Octal/decimal output of Y.  If N > 0, pad with spaces so it fits in N digits

DECOUT:	SKIPA Z,[10.]
OCTOUT:	 MOVEI Z,8.
	HRRM Z,NUMOUT			; I don't want to fry another AC
NUMOUT:	IDIVI Y,
	ADDI Z,"0
	PUSH P,Z
	SOSG N
	 JRST NUMOU1
	JUMPN Y,NUMOU2
	MOVEI Z,<" >
	IDPB Z,X
	SOJG N,.-1
	JRST NUMOU3
NUMOU1:	SKIPE Y
NUMOU2:	 PUSHJ P,NUMOUT
NUMOU3:	POP P,Y
	IDPB Y,X
	POPJ P,

; Job number/PPN/name output

JOBOUT:	MOVEI N,2
	MOVEI Y,(J)
	PUSHJ P,DECOUT
	MOVEI <" >
	IDPB X
	MOVE Y,@PRJPRG
	PUSHJ P,SIXOUT
	MOVEI <" >
	IDPB X
	MOVE Y,@JOBNAM
;	JRST SIXOUT

; Sixbit output routine

SIXOUT:	MOVEI N,6
	SETZ Z,
	ROTC Y,6
	ADDI Z,"A-'A
	IDPB Z,X
	SOJG N,SIXOUT+1
	POPJ P,

; Output text string, called with JSP

TXTSTR:	HRLI Y,440700
	ILDB Y
	JUMPE 1(Y)
	IDPB X
	JRST TXTSTR+1

...LIT:	CONSTA
SUBTTL Random data

PDL:	BLOCK PDLLEN			; stack
HSTADR:	BLOCK 1				; where host table begins
LINCNT:	BLOCK 1				; line count
HDABLK:	BLOCK 13			; terminal location block
HSIZE:	BLOCK 1				; horizontal size
SCREEN:	BLOCK 1				; display screen image pointer

; Display program stuff

COLPOS:	CW COLM,2,HILIN,1,LOLIN,10	; second column, third line
TXTOUT:	CW FNCN,ALPHA,CHNL,0,FNCN,ALPHA	; text output

DPHEAD:	200000,,			; double field mode
	0				; size
	0
	0				; address of low order line select for DD

END IMPSTAT